package com.cjm.algorithm.leetcode;

import com.cjm.algorithm.TreeNode;

/**
 * <hr>
 * <ul>完整二叉树：</ul>
 * <li>1. 叶子节点： 要么值为0， 要么值为1， 其中0表示false， 1表示true；</li>
 * <li>2. 非叶子节点： 要么为2， 要么值为3， 其中2表示逻辑【或or】， 3表示逻辑【与AND】</li>
 * <hr>
 * <ul>计算方法：</ul>
 * <li>如果节点是个叶子节点， 那么节点的值为它本身， 即true或者false；</li>
 * <li>否则， 计算两个孩子的节点值， 然后将该节点的运算符对两个孩子值进行运算。</li>
 * <li>返回根节点root的布尔运算值</li>
 * <hr>
 * <br/>
 * <li><p style='font-size:24;font-weight:900'>完整二叉树是每个节点有0个或者2个孩子的二叉树</p></li>
 * <li><p style='font-size:24;font-weight:900'>叶子节点是没有孩子的节点。</p></li>
 * <hr>
 * <br/>
 * <a href='https://leetcode.cn/problems/evaluate-boolean-binary-tree/' >计算布尔二叉树的值</a>
 * <hr>
 */
public class EvaluateTree2231 {
    public static boolean evaluateTree(TreeNode root) {
        if (root.left == null) {
            // 如果这个节点没有左节点， 那么它也没有右节点， 所以读取的值， 为它本身的值
            // 如果没有左节点， 那么说明它自己是叶子节点， 值为本身的值
            return root.val == 1;
        }
        if (root.val == 2) {
            // or
            return evaluateTree(root.left) || evaluateTree(root.right);
        } else {
            // and
            return evaluateTree(root.left) && evaluateTree(root.right);
        }
    }
}
